#include <iostream>
#include <cstdio>
#include <malloc.h>
#include <rpc/xdr.h>
#include <cstring>

using namespace std;

char *func()
{
    char *res = (char*)malloc(sizeof(char) * 1024);
    sprintf(res, "nihao, 你好 \n");
    return res;
}

int test()
{
    printf("beging....\n");

    short age = 34;
    char sex = 'M';
    double weights = 66.66;
    char name[20];
    strcpy(name, "LJ");
    char *p = name;

    XDR xdr; // 定义一个 xdr对象
    char buff[120];

    // 创建编码模式,buff是自定义的缓冲区，存放参数
    // 120 其实是 buff的大小, XDR_ENCODE是编码, XDR_DECODE是解码
    xdrmem_create(&xdr, buff, 120, XDR_ENCODE);
    // 编码字符串要用 xdr_string
    // 引用&的参数必须是变量，不能是字符串的数组名，这是 c语言的规则，数组名虽然是数组的首地址指针，但是不是变量，不能引用
    xdr_string(&xdr, &p, sizeof p);
    xdr_short(&xdr, &age); // 根据参数类型进行编码
    xdr_char(&xdr, &sex);
    xdr_double(&xdr, &weights);

    xdrmem_create(&xdr, buff, 120, XDR_DECODE);
    char name2[20];
    char *p2 = name2;
    cout << strlen(p2) << endl;
    xdr_string(&xdr, &p2, sizeof p2);
    short age2;
    xdr_short(&xdr, &age2);
    char sex2;
    xdr_char(&xdr, &sex2);
    double weights2;
    xdr_double(&xdr, &weights2);

    printf("%s %d %c %1f\n", p2, age2, sex2, weights2);

    memset(buff, 0, sizeof buff);
    xdrmem_create(&xdr, buff, sizeof buff, XDR_ENCODE);
    char *p4 = (char*)malloc(sizeof(char) * 1024);
    p4 = func();
    printf("p4 = %s\n", p4);
    printf("sizeof p4 = %d\n", (int)(sizeof p4));
    xdr_string(&xdr, &p4, 1024);

    xdrmem_create(&xdr, buff, sizeof buff, XDR_DECODE);
    char str2[1024];
    char *p5 = str2;
    xdr_string(&xdr, &p5, 1024);
    printf("str2 = %s\n", str2);

    // 使用文件编码 xdr，不使用内存中的缓冲区来存储信息
//    FILE *pFile = fopen("in.txt", "ab+");
//    XDR xdr;
//    xdrstdio_create(&xdr, pFile, XDR_ENCODE);
//    int n = 299;
//    xdr_int(&xdr, &n);
//    xdr_destroy(&xdr);
//    fclose(pFile);

    return 0;
}
